/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package continuity;

import continuity.View.*;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author FornetTeam
 */
public class Node {
    /**
     * A mezőben lévő elem.
     */
    private Element element;
    /**
     * A szomszédos mezők.
     */
    private List<Node> neighbors;
    
    /**
     * Az elemei azt adják meg, hogy az egyes Characterek itt vannak-e.
     */
    private List<Boolean> isHere;
    
    /**
     * Lekérdezi, hogy az adott mezőn tartózkodik-e a karakter.
     * @param characterNumber A karakter sorszáma(0 vagy 1).
     * @return Itt van-e az adott számú karakter.
     */
    public boolean getIsHere(int characterNumber) {
        return isHere.get(characterNumber);
    }
    /**
     * Beállítja, hogy ott van-e a Character.
     * @param characterNumber A beállítandó karakter sorszáma(0 vagy 1).
     * @param b A beállítandó érték.
     */
    public void setIsHere(int characterNumber, boolean b) {
        isHere.set(characterNumber, b);
    }
    /**
     * Feltölti a szomszédlistát NULL-lal (4 szomszédra készülve),
     * hogy a hozzáadásnál ne kapjuk IndexOutOfRangeException-t.
     * Miután  beálítottuk az egyes szomszédokat, ahol NULL mara ott nem lehet szomszéd mert,
     * a Node a Room szélén van.
     */
    private void initNeighbors() {
        for(int i=0;i<4;i++) {
            neighbors.add(null);
        }
    }
    
    /**
     * A Node konstruktora.
     */
    public Node() {
  
        neighbors=new ArrayList<Node>();
        isHere=new ArrayList<Boolean>();
        isHere.add(Boolean.FALSE);
        isHere.add(Boolean.FALSE);
        initNeighbors();
    }
    
    /**
     * A mezőben lévő elemet adja vissza.
     * @return Az elem.
     */
    public Element getElement() {
        
        return element;
    }
    /**
     * Beállítja a mezőben lévő elemet.
     * @param e Az hozzárendelt elem.
     */
    public void setElement(Element e) {
        this.element=e;
        e.setParent(this);
    }
    /**
     * Az nbr-edik szomszédos mezőt adja vissza.
     * @param nbr Hanyas számú szomszéd kell.
     * @return Az megfelelő szomszédos helyen lévő Node.
     */
    public Node getNeighbor(int nbr) {

        return neighbors.get(nbr);
    }
    /**
     * Egy mező hozzáadása a szomszédok listájához.
     * @param n A hozzáadandó mező.
     * @param nbr Melyik pozícióba.
     *  irányok:
     *   3
     *  2m0
     *   1
     * tehát: jobbra - 0, lefele - 1, balra - 2, fel - 3
     */
    
    public void setNeighbor(Node n, int nbr) {

        
        /**
         * A függvény lényegi része, itt történik a beállítás.
         */
        neighbors.set(nbr, n);

    }
    
    
    @Override   
    public String toString() {   
        String ret=getElement().toString();   
        if(isHere.get(0) == true && isHere.get(1) == true) {   
            ret=ret.charAt(0) + "3";   
       }   
        else if(isHere.get(0) == true && isHere.get(1) == false) {   
            ret=ret.charAt(0) + "1";   
       }   
       else if(isHere.get(0) == false && isHere.get(1) == true) {   
           ret=ret.charAt(0) + "2";  
       }   
       return ret;   
    }
     
    public NodeView createNodeView() {
        String s=element.toString();
        char c=s.charAt(0);
        ElementView ev=null;
        switch(c) {
            case 'K':
            case 'P':
                ev=new KeyElementView((KeyElement)element);
                break;
            case 'O':
                ev=new ObstacleElementView((ObstacleElement)element);
                break;
            case 'D':
            case 'd':
                ev=new DoorElementView((DoorElement)element);
                break;
            case 'E':
                ev=new EmptyElementView((EmptyElement)element);
                break;
        }
        NodeView nv=new NodeView(this, ev);
        return nv;
    }
}